/**
 * 
 */
package mx.com.asteca.vista;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.model.SelectItem;

import mx.com.asteca.comun.Constantes;
import mx.com.asteca.comun.dto.InstructorMateriaDTO;
import mx.com.asteca.comun.dto.MateriaRegistroDTO;
import mx.com.asteca.comun.dto.PermisosBooleanDTO;
import mx.com.asteca.comun.dto.PersonaDTO;
import mx.com.asteca.comun.dto.SeguridadDTO;
import mx.com.asteca.comun.dto.SeguridadUsrLnDTO;
import mx.com.asteca.fachada.FachadaException;
import mx.com.asteca.fachada.SeguridadFachada;
import mx.com.asteca.fachada.SeguridadUsrLnFachada;

import org.primefaces.context.RequestContext;
import org.primefaces.model.DualListModel;
import org.springframework.util.CollectionUtils;

/**
 * @author JAMARO
 * 
 */
@ManagedBean(name = Constantes.BEAN_SEGURIDAD)
@ViewScoped
public class SeguridadControlador extends BaseController {

	private static final String modulo = Constantes.MODULO_SEGURIDAD;
	private PermisosBooleanDTO permisos;
	@ManagedProperty("#{seguridadFachadaImpl}")
	private transient SeguridadFachada fachadaSeguridad;
	@ManagedProperty("#{seguridadUsrLnFachadaImpl}")
	private transient SeguridadUsrLnFachada fachadaSeguridadUsrLn;
	private List<SeguridadDTO> listItems;
	private SeguridadDTO itemSelected;
	private SeguridadDTO nuevoItem;
	private List<SeguridadDTO> filteredList;
	private String nuevoIpSubnet;
	private String editarIpSubnet;
	private String nuevoAcceso;
	private String editarAcceso;
	private List<SelectItem> listSelectAcceso;
	private DualListModel<PersonaDTO> nuevoDualListModel;
	private List<PersonaDTO> nuevoListaPersonas;
	private List<PersonaDTO> nuevoListaPersonasTarget;

	@PostConstruct
	public void populate() {
		setPermisos(super.stablishSessionPermissions());
	}

	private void initListaSelectAcceso() {
		if (CollectionUtils.isEmpty(listSelectAcceso)) {
			listSelectAcceso = new ArrayList<SelectItem>();
			SelectItem si = new SelectItem("S", "Si");
			SelectItem no = new SelectItem("N", "No");
			listSelectAcceso.add(si);
			listSelectAcceso.add(no);
		}
	}

	private void initListItems() {
		if (CollectionUtils.isEmpty(listItems)) {
			try {
				listItems = fachadaSeguridad.getAll();
			} catch (FachadaException e) {
				super.addErrorMessage(Constantes.MESSAGE_TITLE_ERROR,
						Constantes.ERROR_OBTENIENDO_LISTA_CATALOGO);
			}
		}
	}

	private void initNuevoDualListModel() {
		nuevoListaPersonas = getListaPersonasSource();
		nuevoListaPersonasTarget = new ArrayList<PersonaDTO>();
		List<SeguridadUsrLnDTO> listaSeguridad = new ArrayList<SeguridadUsrLnDTO>();
		try {
			listaSeguridad = fachadaSeguridadUsrLn.findByIdSeguridad(itemSelected.getIdSeguridad());
		} catch (FachadaException e) {
			super.addErrorMessage(Constantes.MESSAGE_TITLE_ERROR, Constantes.ERROR_OBTENIENDO_LISTA_CATALOGO);
		}catch(NullPointerException nex){
		}
		if(!CollectionUtils.isEmpty(listaSeguridad)){
			for(SeguridadUsrLnDTO dto : listaSeguridad){
				PersonaDTO persona = new PersonaDTO();
				persona.setIdPersona(dto.getIdPersona());
				int indexTemp = nuevoListaPersonas.indexOf(persona);
				PersonaDTO personaTemp = nuevoListaPersonas.get(indexTemp);
				nuevoListaPersonas.remove(persona);
				nuevoListaPersonasTarget.add(personaTemp);
			}
		}
		
		nuevoDualListModel = new DualListModel<PersonaDTO>(nuevoListaPersonas,
				nuevoListaPersonasTarget);
	}

	private List<PersonaDTO> getListaPersonasSource() {
		List<PersonaDTO> lista = new ArrayList<PersonaDTO>();
		try {
			lista = fachadaSeguridad.findPersonasSource();
		} catch (FachadaException e) {
			super.addErrorMessage(Constantes.MESSAGE_TITLE_ERROR,
					Constantes.ERROR_OBTENIENDO_LISTA_CATALOGO);
		}
		return lista;
	}

	public void save() {
		nuevoItem = new SeguridadDTO();
		nuevoItem.setAcceso(nuevoAcceso.charAt(0));
		nuevoItem.setIpSubnet(nuevoIpSubnet);
		try {
			int pk = fachadaSeguridad.save(nuevoItem);
			RequestContext.getCurrentInstance().execute("nuevoDialog.hide()");
			super.addInfoMessage(Constantes.MESSAGE_TITLE_INFO,
					Constantes.NUEVO_REGISTRO_EXITOSO);
			addBitacora(Constantes.ACCION_NUEVO_REGISTRO,
					Constantes.ACCION_NUEVO_REGISTRO_EXITOSO_MENSAJE
							+ ":Seguridad " + pk + ":");
			listItems = null;

		} catch (FachadaException e) {
			super.addErrorMessage(Constantes.MESSAGE_TITLE_ERROR,
					Constantes.ERROR_NUEVO_REGISTRO);
			addBitacora(Constantes.ACCION_NUEVO_REGISTRO,
					Constantes.ACCION_NUEVO_REGISTRO_FALLIDO_MENSAJE
							+ ":Seguridad:");
			return;
		}
	}

	public void saveCancel() {

	}

	public void update() {
		if (itemSelected == null) {
			super.addWarningMessage(Constantes.MESSAGE_TITLE_WARNING,
					Constantes.WARNING_SELECCIONAR_UN_REGISTRO);
			return;
		}
		if (editarAcceso != null && !editarAcceso.isEmpty()) {
			itemSelected.setAcceso(editarAcceso.charAt(0));
		}
		if (editarIpSubnet != null && !editarIpSubnet.isEmpty()) {
			itemSelected.setIpSubnet(editarIpSubnet);
		}
		try {
			fachadaSeguridad.update(itemSelected);
			super.addInfoMessage(Constantes.MESSAGE_TITLE_INFO,
					Constantes.UPDATE_REGISTRO_EXITOSO);
			addBitacora(Constantes.ACCION_UPDATE_REGISTRO,
					Constantes.ACCION_UPDATE_REGISTRO_EXITOSO_MENSAJE
							+ ":Seguridad " + itemSelected.getIdSeguridad()
							+ ":");
		} catch (FachadaException e) {
			super.addErrorMessage(Constantes.MESSAGE_TITLE_ERROR,
					Constantes.ERROR_UPDATE_REGISTRO);
			addBitacora(Constantes.ACCION_UPDATE_REGISTRO,
					Constantes.ACCION_UPDATE_REGISTRO_FALLIDO_MENSAJE);
			return;
		}
	}

	public void delete() {
		if (itemSelected == null) {
			super.addWarningMessage(Constantes.MESSAGE_TITLE_WARNING,
					Constantes.WARNING_SELECCIONAR_UN_REGISTRO);
			return;
		}
		try {
			List<SeguridadUsrLnDTO> listaNegra = fachadaSeguridadUsrLn
					.findByIdSeguridad(itemSelected.getIdSeguridad());
			if (!CollectionUtils.isEmpty(listaNegra)) {
				for (SeguridadUsrLnDTO ln : listaNegra) {
					fachadaSeguridadUsrLn.remove(ln);
				}
			}
			fachadaSeguridad.remove(itemSelected);
			super.addInfoMessage(Constantes.DELETE_REGISTRO_EXITOSO);
			addBitacora(Constantes.ACCION_DELETE_REGISTRO,
					Constantes.ACCION_DELETE_REGISTRO_EXITOSO_MENSAJE
							+ ":Seguridad" + itemSelected.getIdSeguridad()
							+ ":");
		} catch (FachadaException e) {
			super.addErrorMessage(Constantes.MESSAGE_TITLE_ERROR,
					Constantes.ERROR_DELETE_REGISTRO);
			addBitacora(Constantes.ACCION_DELETE_REGISTRO,
					Constantes.ACCION_DELETE_REGISTRO_FALLIDO_MENSAJE
							+ ":Seguridad" + itemSelected.getIdSeguridad()
							+ ":");
			return;
		}
	}

	public void saveListaNegra() {
		List<PersonaDTO> listaTarget = nuevoDualListModel.getTarget();
		List<PersonaDTO> listaSource = nuevoDualListModel.getSource();
		List<SeguridadUsrLnDTO> listaTemp;
		try {
			listaTemp = fachadaSeguridadUsrLn.findByIdSeguridad(itemSelected.getIdSeguridad());
		} catch (FachadaException e1) {
			super.addErrorMessage(Constantes.MESSAGE_TITLE_ERROR, Constantes.ERROR_DELETE_REGISTRO);
			return;
		}
		for(SeguridadUsrLnDTO dto : listaTemp){
			try {
				fachadaSeguridadUsrLn.remove(dto);
			} catch (FachadaException e) {
				super.addErrorMessage(Constantes.MESSAGE_TITLE_ERROR, Constantes.ERROR_DELETE_REGISTRO);
				return;
			}
		}
		for (Object o : listaTarget) {
			Integer idPersona = Integer.parseInt(o.toString());
			SeguridadUsrLnDTO dto = new SeguridadUsrLnDTO();
			dto.setIdPersona(idPersona);
			dto.setIdSeguridad(itemSelected.getIdSeguridad());
			try {
				fachadaSeguridadUsrLn.save(dto);
			} catch (FachadaException e) {
				super.addErrorMessage(Constantes.MESSAGE_TITLE_ERROR,
						Constantes.ERROR_NUEVO_REGISTRO);
				addBitacora(Constantes.ACCION_NUEVO_REGISTRO, Constantes.ACCION_NUEVO_REGISTRO_FALLIDO_MENSAJE+":Seguridad:");
				return;
			}
			RequestContext.getCurrentInstance().execute("listaNegraDialog.hide()");
			super.addInfoMessage(Constantes.MESSAGE_TITLE_INFO, Constantes.NUEVO_REGISTRO_EXITOSO);
			addBitacora(Constantes.ACCION_NUEVO_REGISTRO, Constantes.ACCION_NUEVO_REGISTRO_EXITOSO_MENSAJE+":Seguridad Lista Negra: "+itemSelected.getIdSeguridad()+":");
		}
	}

	/**
	 * @return the permisos
	 */
	public PermisosBooleanDTO getPermisos() {
		return permisos;
	}

	/**
	 * @param permisos
	 *            the permisos to set
	 */
	public void setPermisos(PermisosBooleanDTO permisos) {
		this.permisos = permisos;
		super.setAlta(permisos.isAlta());
		super.setBorrar(permisos.isBorrar());
		super.setCambios(permisos.isEdicion());
		super.setConsulta(permisos.isConsulta());
		super.setImpresion(permisos.isImpresion());
	}

	@Override
	String getModulo() {
		return modulo;
	}

	/**
	 * @return the fachadaSeguridad
	 */
	public SeguridadFachada getFachadaSeguridad() {
		return fachadaSeguridad;
	}

	/**
	 * @param fachadaSeguridad
	 *            the fachadaSeguridad to set
	 */
	public void setFachadaSeguridad(SeguridadFachada fachadaSeguridad) {
		this.fachadaSeguridad = fachadaSeguridad;
	}

	/**
	 * @return the listItems
	 */
	public List<SeguridadDTO> getListItems() {
		initListItems();
		return listItems;
	}

	/**
	 * @param listItems
	 *            the listItems to set
	 */
	public void setListItems(List<SeguridadDTO> listItems) {
		this.listItems = listItems;
	}

	/**
	 * @return the nuevoItem
	 */
	public SeguridadDTO getNuevoItem() {
		return nuevoItem;
	}

	/**
	 * @param nuevoItem
	 *            the nuevoItem to set
	 */
	public void setNuevoItem(SeguridadDTO nuevoItem) {
		this.nuevoItem = nuevoItem;
	}

	/**
	 * @return the itemSelected
	 */
	public SeguridadDTO getItemSelected() {
		return itemSelected;
	}

	/**
	 * @param itemSelected
	 *            the itemSelected to set
	 */
	public void setItemSelected(SeguridadDTO itemSelected) {
		this.itemSelected = itemSelected;
	}

	/**
	 * @return the filteredList
	 */
	public List<SeguridadDTO> getFilteredList() {
		return filteredList;
	}

	/**
	 * @param filteredList
	 *            the filteredList to set
	 */
	public void setFilteredList(List<SeguridadDTO> filteredList) {
		this.filteredList = filteredList;
	}

	/**
	 * @return the nuevoIpSubnet
	 */
	public String getNuevoIpSubnet() {
		return nuevoIpSubnet;
	}

	/**
	 * @param nuevoIpSubnet
	 *            the nuevoIpSubnet to set
	 */
	public void setNuevoIpSubnet(String nuevoIpSubnet) {
		this.nuevoIpSubnet = nuevoIpSubnet;
	}

	/**
	 * @return the nuevoAcceso
	 */
	public String getNuevoAcceso() {
		return nuevoAcceso;
	}

	/**
	 * @param nuevoAcceso
	 *            the nuevoAcceso to set
	 */
	public void setNuevoAcceso(String nuevoAcceso) {
		this.nuevoAcceso = nuevoAcceso;
	}

	/**
	 * @return the listSelectAcceso
	 */
	public List<SelectItem> getListSelectAcceso() {
		initListaSelectAcceso();
		return listSelectAcceso;
	}

	/**
	 * @param listSelectAcceso
	 *            the listSelectAcceso to set
	 */
	public void setListSelectAcceso(List<SelectItem> listSelectAcceso) {
		this.listSelectAcceso = listSelectAcceso;
	}

	/**
	 * @return the editarIpSubnet
	 */
	public String getEditarIpSubnet() {
		return editarIpSubnet;
	}

	/**
	 * @param editarIpSubnet
	 *            the editarIpSubnet to set
	 */
	public void setEditarIpSubnet(String editarIpSubnet) {
		this.editarIpSubnet = editarIpSubnet;
	}

	/**
	 * @return the editarAcceso
	 */
	public String getEditarAcceso() {
		return editarAcceso;
	}

	/**
	 * @param editarAcceso
	 *            the editarAcceso to set
	 */
	public void setEditarAcceso(String editarAcceso) {
		this.editarAcceso = editarAcceso;
	}

	/**
	 * @return the fachadaSeguridadUsrLn
	 */
	public SeguridadUsrLnFachada getFachadaSeguridadUsrLn() {
		return fachadaSeguridadUsrLn;
	}

	/**
	 * @param fachadaSeguridadUsrLn
	 *            the fachadaSeguridadUsrLn to set
	 */
	public void setFachadaSeguridadUsrLn(
			SeguridadUsrLnFachada fachadaSeguridadUsrLn) {
		this.fachadaSeguridadUsrLn = fachadaSeguridadUsrLn;
	}

	/**
	 * @return the nuevoDualListModel
	 */
	public DualListModel<PersonaDTO> getNuevoDualListModel() {
		initNuevoDualListModel();
		return nuevoDualListModel;
	}

	/**
	 * @param nuevoDualListModel
	 *            the nuevoDualListModel to set
	 */
	public void setNuevoDualListModel(
			DualListModel<PersonaDTO> nuevoDualListModel) {
		this.nuevoDualListModel = nuevoDualListModel;
	}

	/**
	 * @return the nuevoListaPersonas
	 */
	public List<PersonaDTO> getNuevoListaPersonas() {
		return nuevoListaPersonas;
	}

	/**
	 * @param nuevoListaPersonas
	 *            the nuevoListaPersonas to set
	 */
	public void setNuevoListaPersonas(List<PersonaDTO> nuevoListaPersonas) {
		this.nuevoListaPersonas = nuevoListaPersonas;
	}

	/**
	 * @return the nuevoListaPersonasTarget
	 */
	public List<PersonaDTO> getNuevoListaPersonasTarget() {
		return nuevoListaPersonasTarget;
	}

	/**
	 * @param nuevoListaPersonasTarget
	 *            the nuevoListaPersonasTarget to set
	 */
	public void setNuevoListaPersonasTarget(
			List<PersonaDTO> nuevoListaPersonasTarget) {
		this.nuevoListaPersonasTarget = nuevoListaPersonasTarget;
	}
}
